home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
tools
/
ask
/
askdates
/
source
/
askdtfmt.c
< prev
Wrap
Text File
|
1998-08-21
|
5KB
|
210 lines
/*****************************************************************************/
// ASKDatesのフォーマットファイルのテキスト→バイナリー変換をする
/*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // exit()
#include "defines.h"
#include "aparam.h"
#include "astdio.h"
#include "adisk.h" // fd_path
#include "amacro.h"
const char prog[]="@@> ASKDtFmt.C : 1998/08/21 FRI : UTILITY : ASKDtFmt";
/*****************************************************************************/
#define SINO 0xff // 識別子
typedef struct {
unchar *name; // 識別子名
short code; // 識別番号;$ffは入れない
} SIKIBETU;
SIKIBETU sym[]={
{"YYY4",0x01} // 西暦4桁
,{"Y2" ,0x02} // 西暦下2桁
,{"GG" ,0x03} // 平成2桁
,{"G2" ,0x03} // 平成2桁
,{"MM" ,0x04} // 月2桁
,{"M2" ,0x04} // 月2桁
,{"DD" ,0x05} // 日2桁
,{"D2" ,0x05} // 日2桁
,{"WE3" ,0x06} // 曜日英字3桁
,{"WJ" ,0x07} // 曜日日本語1桁
,{"H2" ,0x08} // 24時制時間
,{"H1" ,0x09} // 12時制時間
,{"AP" ,0x0a} // AM/PM
,{"FF" ,0x0b} // 分
,{"F2" ,0x0b} // 分
,{"SS" ,0x0c} // 秒
,{"S2" ,0x0c} // 秒
};
#define SYMS (sizeof(sym)/sizeof(SIKIBETU))
#define HEADER "ASKDates FMT1\x0d\x0a\x1a"
#define HEADLEN (sizeof(HEADER)-1) // EOSは入らない
#define LMAX 78 // 1行の最大バイト数
/*****************************************************************************/
int Txt2Bin(unchar *fntxt,unchar *fnbin)
// テキストをバイナリに変換する
{
FILE *fpt,*fpb;
int ret=0,len,i;
unchar line[LMAX],buff[LMAX],*s,*b,c;
fpt=fopen(fntxt,"rt");
if (fpt==NULL) {
printsn("テキストファイルが見つかりません:",fntxt);
return(1);
}
fpb=fopen(fnbin,"wb");
if (fpb==NULL) {
fclose(fpt);
printsn("バイナリファイルが作成できません:",fnbin);
return(2);
}
// ヘッダー書き出し
fwrite(HEADER,HEADLEN,1,fpb);
// メイン
while (!read1line1(fpt,line,LMAX)) { // 1行読み出し
s=line;
if (*s==0) continue; // 空行
len=1; // 最後のEOSの分
b=buff;
while ((c=*s++)!=0) {
if (check_kanji1(c)) { // 2バイト文字
len+=2;
if (len>=LMAX) goto LENOVER;
*b++=c;
*b++=*s++;
continue;
}
if (c<' ') {
printsn("コントロールコードが入っています:",line);
ret=4;
break;
}
// 識別子チェック
for (i=0;i<SYMS;i++) {
unchar *nm;
nm=sym[i].name;
if (toupper(c)==*nm) { // 先頭1文字一致
int ln;
ln=strlen(++nm);
if (memcmpi(s,nm,ln)==0) { // 一致
s+=ln; // 一致した部分を飛ばす
if (++len>=LMAX) goto LENOVER;
*b++=SINO;
c=sym[i].code;
break;
}
}
}
// 普通文字である
if (++len>=LMAX) {
LENOVER:;
printsn("1行の長さが長すぎます:",line);
ret=3;
break;
}
*b++=c;
}
*b=0; // End of line
fwrite(buff,len,1,fpb);
}
if (ferror(fpt)) ret=10;
if (ferror(fpb)) ret=11;
fclose(fpb);
fclose(fpt);
return(ret);
}
/*****************************************************************************/
int BinLook(unchar *fnbin)
// バイナリの内容を表示する
{
int ret=0,c,i;
FILE *fpb;
unchar line[LMAX];
fpb=fopen(fnbin,"rb");
if (fpb==NULL) {
printsn("バイナリファイルが見つかりません:",fnbin);
return(1);
}
// ヘッダー読み出し
fread(line,HEADLEN,1,fpb);
if (memcmp(line,HEADER,HEADLEN)) {
printsn("これはASKDatesフォーマットバイナリファイルではありません:",fnbin);
return(2);
}
// 内容表示
// HEADER
// ...[00]
do {
// 1行読み出し
while (c=fgetc(fpb),c!=0&&c!=-1) {
if (c==SINO) {
c=fgetc(fpb); // 識別番号
for (i=0;i<SYMS;i++) {
if (sym[i].code==c) {
prints(sym[i].name);
break;
}
}
} else printc(c);
}
crlf();
} while (c!=-1); // EOFまで
fclose(fpb);
return(ret);
}
/*****************************************************************************/
void main(int argc,unchar *argv[])
{
unchar *fntxt,fnbin[MAXPATH];
int i,ret;
int fhelp=0,frev;
/* オプションチェック初期化 */
clear_param();
HELP:;
if (helpcom(argc,argv,fhelp,"ASKDtFmt","[/B] テキスト [バイナリ[.ask]]")) exit(fhelp? fhelp:255);
/* 強制バイナリ内容表示モード */
frev=check_param2("B",argv,argc,0);
/* オプションチェック */
i=check_param_error(argv,argc);
if (i) {
printsn("\aオプションエラーです:",argv[i]);
exit(1);
}
// ファイル名取得
i=getfname(argc,argv,1,NULL);
if (i==0) { // ファイル名がない
fhelp=100;
goto HELP;
}
fntxt=argv[i];
ret=0;
if (!frev) { // 通常モード
i=getfname(argc,argv,2,NULL);
fnget(fnbin,i==0? fntxt:fd_path(argv[i]),"ask");
printss(fntxt,"→");
printss(fnbin,"\n");
ret=Txt2Bin(fntxt,fnbin);
} else { // バイナリー内容表示モード
ret=BinLook(fntxt);
}
exit(ret);
}
/*****************************************************************************/